{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f28455fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# data visualization\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "\n",
    "import tensorflow as tf\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from keras.models import Sequential\n",
    "from keras.layers import LSTM,Dense,Dropout\n",
    "from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score\n",
    "\n",
    "import math \n",
    "import os "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "506cd016",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "sns.set(font='SimHei')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2fd9ce76",
   "metadata": {},
   "outputs": [],
   "source": [
    "df= pd.read_csv('../dataset/sh600031.csv')  # 读取股票文件\n",
    "df.set_index('date',inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "61c70e7a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2003-07-03</th>\n",
       "      <td>23.00</td>\n",
       "      <td>23.00</td>\n",
       "      <td>20.10</td>\n",
       "      <td>21.30</td>\n",
       "      <td>33816715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-04</th>\n",
       "      <td>21.30</td>\n",
       "      <td>22.18</td>\n",
       "      <td>21.05</td>\n",
       "      <td>21.84</td>\n",
       "      <td>7697544</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-07</th>\n",
       "      <td>21.90</td>\n",
       "      <td>21.96</td>\n",
       "      <td>21.51</td>\n",
       "      <td>21.80</td>\n",
       "      <td>3951205</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-08</th>\n",
       "      <td>21.80</td>\n",
       "      <td>22.22</td>\n",
       "      <td>21.70</td>\n",
       "      <td>21.91</td>\n",
       "      <td>2117357</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-09</th>\n",
       "      <td>21.75</td>\n",
       "      <td>22.65</td>\n",
       "      <td>21.70</td>\n",
       "      <td>22.47</td>\n",
       "      <td>3440447</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             open   high    low  close    volume\n",
       "date                                            \n",
       "2003-07-03  23.00  23.00  20.10  21.30  33816715\n",
       "2003-07-04  21.30  22.18  21.05  21.84   7697544\n",
       "2003-07-07  21.90  21.96  21.51  21.80   3951205\n",
       "2003-07-08  21.80  22.22  21.70  21.91   2117357\n",
       "2003-07-09  21.75  22.65  21.70  22.47   3440447"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "160539e0",
   "metadata": {},
   "source": [
    "## 数据检查"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "54a2df6e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function to check the missing percent of a DatFrame;\n",
    "def check_missing_data(df):\n",
    "    total = df.isnull().sum().sort_values(ascending = False)\n",
    "    percent = round(df.isnull().sum().sort_values(ascending = False) * 100 /len(df),2)\n",
    "    return pd.concat([total, percent], axis=1, keys=['Total','Percent'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "862a721d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Total</th>\n",
       "      <th>Percent</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>open</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>high</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>low</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>close</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>volume</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Total  Percent\n",
       "open        0      0.0\n",
       "high        0      0.0\n",
       "low         0      0.0\n",
       "close       0      0.0\n",
       "volume      0      0.0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "check_missing_data(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "350f50c5",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(df.corr())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a81bbda3",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "df.drop(['volume'],axis = 1,inplace= True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "7640dff5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2003-07-03</th>\n",
       "      <td>23.00</td>\n",
       "      <td>23.00</td>\n",
       "      <td>20.10</td>\n",
       "      <td>21.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-04</th>\n",
       "      <td>21.30</td>\n",
       "      <td>22.18</td>\n",
       "      <td>21.05</td>\n",
       "      <td>21.84</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-07</th>\n",
       "      <td>21.90</td>\n",
       "      <td>21.96</td>\n",
       "      <td>21.51</td>\n",
       "      <td>21.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-08</th>\n",
       "      <td>21.80</td>\n",
       "      <td>22.22</td>\n",
       "      <td>21.70</td>\n",
       "      <td>21.91</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-09</th>\n",
       "      <td>21.75</td>\n",
       "      <td>22.65</td>\n",
       "      <td>21.70</td>\n",
       "      <td>22.47</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             open   high    low  close\n",
       "date                                  \n",
       "2003-07-03  23.00  23.00  20.10  21.30\n",
       "2003-07-04  21.30  22.18  21.05  21.84\n",
       "2003-07-07  21.90  21.96  21.51  21.80\n",
       "2003-07-08  21.80  22.22  21.70  21.91\n",
       "2003-07-09  21.75  22.65  21.70  22.47"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c94543c3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.27901685 0.27674383 0.25182185 0.26343232]\n",
      " [0.2532241  0.2643365  0.26720643 0.27196583]\n",
      " [0.26232743 0.2610077  0.27465585 0.27133372]\n",
      " ...\n",
      " [0.27901685 0.27674383 0.28987852 0.28334382]\n",
      " [0.27218935 0.27507943 0.28599185 0.28603032]\n",
      " [0.27279624 0.275836   0.28971657 0.28223765]]\n"
     ]
    }
   ],
   "source": [
    "#获取DataFrame中的数据，形式为数组array形式\n",
    "values=df.values\n",
    "#确保所有数据为float类型\n",
    "values=values.astype('float32')\n",
    " \n",
    "# 特征的归一化处理\n",
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaled = scaler.fit_transform(values)\n",
    "print(scaled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "bee1cd05",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义series_to_supervised()函数\n",
    "# 将时间序列转换为监督学习问题\n",
    "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n",
    "    \"\"\"\n",
    "    将时间序列框定为有监督的学习数据集。\n",
    "        论据：\n",
    "        数据：作为列表或NumPy数组的观察序列。\n",
    "        n_in：作为输入的滞后观测数（X）。\n",
    "        n_out：作为输出的观察数（y）。\n",
    "        dropnan：布尔值，决定是否删除具有NaN值的行。\n",
    "    返回：\n",
    "    pd.DataFrame(用于监督学习)\n",
    "    \"\"\"\n",
    "    n_vars = 1 if type(data) is list else data.shape[1]\n",
    "    df = pd.DataFrame(data)\n",
    "    cols, names = list(), list()\n",
    "    # input sequence (t-n, ... t-1)\n",
    "    for i in range(n_in, 0, -1):\n",
    "        cols.append(df.shift(i))\n",
    "        names += [('var%d(t-%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    # forecast sequence (t, t+1, ... t+n)\n",
    "    for i in range(0, n_out):\n",
    "        cols.append(df.shift(-i))\n",
    "        if i == 0:\n",
    "            names += [('var%d(t)' % (j + 1)) for j in range(n_vars)]\n",
    "        else:\n",
    "            names += [('var%d(t+%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    # put it all together\n",
    "    agg = pd.concat(cols, axis=1)\n",
    "    agg.columns = names\n",
    "    # drop rows with NaN values\n",
    "    if dropnan:\n",
    "        agg.dropna(inplace=True)\n",
    "    return agg"
   ]
  },
  {
   "cell_type": "raw",
   "id": "f331b2f2",
   "metadata": {},
   "source": [
    "该函数有四个参数：\n",
    "\n",
    "    data：输入数据需要是列表或二维的NumPy数组的观察序列。\n",
    "    n_in：输入的滞后观察数（X）。值可以在[1..len（data）]之间，可选的。默认为1。\n",
    "    n_out：输出的观察数（y）。值可以在[0..len（data）-1]之间，可选的。默认为1。\n",
    "    dropnan：Bool值，是否删除具有NaN值的行，可选的。默认为True。\n",
    "\n",
    "该函数返回一个值：\n",
    "\n",
    "    返回：用于监督学习的Pandas DataFrame。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "6ef2ef1e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#将时间序列转换为监督学习问题\n",
    "reframed = series_to_supervised(scaled, 1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "76bad08c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var1(t)</th>\n",
       "      <th>var2(t)</th>\n",
       "      <th>var3(t)</th>\n",
       "      <th>var4(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.279017</td>\n",
       "      <td>0.276744</td>\n",
       "      <td>0.251822</td>\n",
       "      <td>0.263432</td>\n",
       "      <td>0.253224</td>\n",
       "      <td>0.264336</td>\n",
       "      <td>0.267206</td>\n",
       "      <td>0.271966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.253224</td>\n",
       "      <td>0.264336</td>\n",
       "      <td>0.267206</td>\n",
       "      <td>0.271966</td>\n",
       "      <td>0.262327</td>\n",
       "      <td>0.261008</td>\n",
       "      <td>0.274656</td>\n",
       "      <td>0.271334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.262327</td>\n",
       "      <td>0.261008</td>\n",
       "      <td>0.274656</td>\n",
       "      <td>0.271334</td>\n",
       "      <td>0.260810</td>\n",
       "      <td>0.264942</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.273072</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.260810</td>\n",
       "      <td>0.264942</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.273072</td>\n",
       "      <td>0.260052</td>\n",
       "      <td>0.271448</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.281922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.260052</td>\n",
       "      <td>0.271448</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.281922</td>\n",
       "      <td>0.268851</td>\n",
       "      <td>0.275382</td>\n",
       "      <td>0.287449</td>\n",
       "      <td>0.284766</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)   var1(t)   var2(t)   var3(t)  \\\n",
       "1   0.279017   0.276744   0.251822   0.263432  0.253224  0.264336  0.267206   \n",
       "2   0.253224   0.264336   0.267206   0.271966  0.262327  0.261008  0.274656   \n",
       "3   0.262327   0.261008   0.274656   0.271334  0.260810  0.264942  0.277733   \n",
       "4   0.260810   0.264942   0.277733   0.273072  0.260052  0.271448  0.277733   \n",
       "5   0.260052   0.271448   0.277733   0.281922  0.268851  0.275382  0.287449   \n",
       "\n",
       "    var4(t)  \n",
       "1  0.271966  \n",
       "2  0.271334  \n",
       "3  0.273072  \n",
       "4  0.281922  \n",
       "5  0.284766  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reframed.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "aaaf7b39",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var4(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.279017</td>\n",
       "      <td>0.276744</td>\n",
       "      <td>0.251822</td>\n",
       "      <td>0.263432</td>\n",
       "      <td>0.271966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.253224</td>\n",
       "      <td>0.264336</td>\n",
       "      <td>0.267206</td>\n",
       "      <td>0.271966</td>\n",
       "      <td>0.271334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.262327</td>\n",
       "      <td>0.261008</td>\n",
       "      <td>0.274656</td>\n",
       "      <td>0.271334</td>\n",
       "      <td>0.273072</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.260810</td>\n",
       "      <td>0.264942</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.273072</td>\n",
       "      <td>0.281922</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.260052</td>\n",
       "      <td>0.271448</td>\n",
       "      <td>0.277733</td>\n",
       "      <td>0.281922</td>\n",
       "      <td>0.284766</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)   var4(t)\n",
       "1   0.279017   0.276744   0.251822   0.263432  0.271966\n",
       "2   0.253224   0.264336   0.267206   0.271966  0.271334\n",
       "3   0.262327   0.261008   0.274656   0.271334  0.273072\n",
       "4   0.260810   0.264942   0.277733   0.273072  0.281922\n",
       "5   0.260052   0.271448   0.277733   0.281922  0.284766"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除不想预测的特征列，这里只预测收盘价\n",
    "# 所以删除的是var1(t),var2(t),var3(t),\n",
    "reframed.drop(['var1(t)','var2(t)','var3(t)'], axis=1, inplace=True)\n",
    "# 打印数据的前5行\n",
    "reframed.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c52b915c",
   "metadata": {},
   "source": [
    "## 数据划分为训练集和测试集：\n",
    "\n",
    "* 将处理后的数据集划分为训练集和测试集。这里按0.85比例划分，将训练集和测试集的最终输入（X）转换为为LSTM的输入格式，即[samples,timesteps,features]。\n",
    "\n",
    "* Keras LSTM层的工作方式是通过接收3维（N，W，F）的数字阵列，其中N是训练序列的数目，W是序列长度，F是每个序列的特征数目。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "1fb4061b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3759, 1, 4) (3759,)\n",
      "(664, 1, 4) (664,)\n"
     ]
    }
   ],
   "source": [
    "# 划分训练集和测试集\n",
    "train = reframed.iloc[:int(len(reframed)*0.85),:].values\n",
    "test = reframed.iloc[int(len(reframed)*0.85):,:].values\n",
    "# 划分训练集和测试集的输入和输出\n",
    "train_X, train_y = train[:, :-1], train[:, -1]\n",
    "test_X, test_y = test[:, :-1], test[:, -1]\n",
    "#转化为三维数据\n",
    "# reshape input to be 3D [samples, timesteps, features]\n",
    "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))\n",
    "print(train_X.shape, train_y.shape)\n",
    "print(test_X.shape, test_y.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f65a19c",
   "metadata": {},
   "source": [
    "# 模型构建及其预测"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "012a2906",
   "metadata": {},
   "source": [
    "* 搭建LSTM模型并绘制损失图\n",
    "    * 本实验使用keras深度学习框架对模型进行快速搭建。建立Sequential模型，向其中添加LSTM层，设定Dropout为0.5，加入Dense层将其维度聚合为1，激活函数使用relu（也用了sigmoid作为激活函数，但实验效果不如relu），损失函数定为均方差Mean Absolute Error(MAE)。优化算法采用Adam，模型采用50个epochs并且每个batch的大小为100。其中：隐藏层有64个神经元，输出层1个神经元（回归问题），输入变量是一个时间步（t-1）的特征。在fit()函数中设置validation_data参数，记录训练集和测试集的损失。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3ee2975",
   "metadata": {},
   "source": [
    "### 预测一次，并保存预测结构，用于之后的验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b71edde8",
   "metadata": {},
   "outputs": [],
   "source": [
    "checkpoint_save_path = \"./checkpoint/test_3.ckpt\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e85a0f7c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 save_best_only=True,\n",
    "                                                 monitor='val_loss')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a38a1a38",
   "metadata": {},
   "source": [
    "* LSTM(neurons, input_shape=(input_timesteps, input_dim), return_sequences=return_seq)\n",
    "* Dropout(dropout_rate)\n",
    "* Dense(neurons, activation=activation)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "e41c3d1a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 4)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_X.shape[1], train_X.shape[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2738cd6d",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "38/38 - 10s - loss: 0.1753 - val_loss: 0.1625 - 10s/epoch - 258ms/step\n",
      "Epoch 2/50\n",
      "38/38 - 1s - loss: 0.1331 - val_loss: 0.0896 - 644ms/epoch - 17ms/step\n",
      "Epoch 3/50\n",
      "38/38 - 1s - loss: 0.0316 - val_loss: 0.0255 - 693ms/epoch - 18ms/step\n",
      "Epoch 4/50\n",
      "38/38 - 1s - loss: 0.0348 - val_loss: 0.0336 - 578ms/epoch - 15ms/step\n",
      "Epoch 5/50\n",
      "38/38 - 1s - loss: 0.0349 - val_loss: 0.0298 - 723ms/epoch - 19ms/step\n",
      "Epoch 6/50\n",
      "38/38 - 1s - loss: 0.0183 - val_loss: 0.0162 - 632ms/epoch - 17ms/step\n",
      "Epoch 7/50\n",
      "38/38 - 1s - loss: 0.0164 - val_loss: 0.0224 - 591ms/epoch - 16ms/step\n",
      "Epoch 8/50\n",
      "38/38 - 1s - loss: 0.0153 - val_loss: 0.0095 - 644ms/epoch - 17ms/step\n",
      "Epoch 9/50\n",
      "38/38 - 1s - loss: 0.0153 - val_loss: 0.0242 - 616ms/epoch - 16ms/step\n",
      "Epoch 10/50\n",
      "38/38 - 1s - loss: 0.0148 - val_loss: 0.0110 - 649ms/epoch - 17ms/step\n",
      "Epoch 11/50\n",
      "38/38 - 1s - loss: 0.0157 - val_loss: 0.0317 - 610ms/epoch - 16ms/step\n",
      "Epoch 12/50\n",
      "38/38 - 1s - loss: 0.0168 - val_loss: 0.0149 - 597ms/epoch - 16ms/step\n",
      "Epoch 13/50\n",
      "38/38 - 1s - loss: 0.0147 - val_loss: 0.0176 - 588ms/epoch - 15ms/step\n",
      "Epoch 14/50\n",
      "38/38 - 1s - loss: 0.0187 - val_loss: 0.0535 - 572ms/epoch - 15ms/step\n",
      "Epoch 15/50\n",
      "38/38 - 1s - loss: 0.0231 - val_loss: 0.0648 - 586ms/epoch - 15ms/step\n",
      "Epoch 16/50\n",
      "38/38 - 1s - loss: 0.0295 - val_loss: 0.1269 - 570ms/epoch - 15ms/step\n",
      "Epoch 17/50\n",
      "38/38 - 1s - loss: 0.0525 - val_loss: 0.0963 - 599ms/epoch - 16ms/step\n",
      "Epoch 18/50\n",
      "38/38 - 1s - loss: 0.0428 - val_loss: 0.1188 - 611ms/epoch - 16ms/step\n",
      "Epoch 19/50\n",
      "38/38 - 1s - loss: 0.0525 - val_loss: 0.0771 - 624ms/epoch - 16ms/step\n",
      "Epoch 20/50\n",
      "38/38 - 1s - loss: 0.0284 - val_loss: 0.0668 - 627ms/epoch - 16ms/step\n",
      "Epoch 21/50\n",
      "38/38 - 1s - loss: 0.0228 - val_loss: 0.0368 - 620ms/epoch - 16ms/step\n",
      "Epoch 22/50\n",
      "38/38 - 1s - loss: 0.0211 - val_loss: 0.0539 - 610ms/epoch - 16ms/step\n",
      "Epoch 23/50\n",
      "38/38 - 1s - loss: 0.0243 - val_loss: 0.0903 - 615ms/epoch - 16ms/step\n",
      "Epoch 24/50\n",
      "38/38 - 1s - loss: 0.0393 - val_loss: 0.0907 - 670ms/epoch - 18ms/step\n",
      "Epoch 25/50\n",
      "38/38 - 1s - loss: 0.0401 - val_loss: 0.0771 - 576ms/epoch - 15ms/step\n",
      "Epoch 26/50\n",
      "38/38 - 1s - loss: 0.0305 - val_loss: 0.0931 - 589ms/epoch - 15ms/step\n",
      "Epoch 27/50\n",
      "38/38 - 1s - loss: 0.0323 - val_loss: 0.0644 - 696ms/epoch - 18ms/step\n",
      "Epoch 28/50\n",
      "38/38 - 1s - loss: 0.0284 - val_loss: 0.0647 - 631ms/epoch - 17ms/step\n",
      "Epoch 29/50\n",
      "38/38 - 1s - loss: 0.0273 - val_loss: 0.0421 - 608ms/epoch - 16ms/step\n",
      "Epoch 30/50\n",
      "38/38 - 1s - loss: 0.0211 - val_loss: 0.0262 - 586ms/epoch - 15ms/step\n",
      "Epoch 31/50\n",
      "38/38 - 1s - loss: 0.0177 - val_loss: 0.0407 - 630ms/epoch - 17ms/step\n",
      "Epoch 32/50\n",
      "38/38 - 1s - loss: 0.0212 - val_loss: 0.0674 - 567ms/epoch - 15ms/step\n",
      "Epoch 33/50\n",
      "38/38 - 1s - loss: 0.0351 - val_loss: 0.0758 - 616ms/epoch - 16ms/step\n",
      "Epoch 34/50\n",
      "38/38 - 1s - loss: 0.0343 - val_loss: 0.0678 - 614ms/epoch - 16ms/step\n",
      "Epoch 35/50\n",
      "38/38 - 1s - loss: 0.0277 - val_loss: 0.0747 - 591ms/epoch - 16ms/step\n",
      "Epoch 36/50\n",
      "38/38 - 1s - loss: 0.0273 - val_loss: 0.0612 - 638ms/epoch - 17ms/step\n",
      "Epoch 37/50\n",
      "38/38 - 1s - loss: 0.0247 - val_loss: 0.0562 - 598ms/epoch - 16ms/step\n",
      "Epoch 38/50\n",
      "38/38 - 1s - loss: 0.0217 - val_loss: 0.0376 - 675ms/epoch - 18ms/step\n",
      "Epoch 39/50\n",
      "38/38 - 1s - loss: 0.0183 - val_loss: 0.0383 - 622ms/epoch - 16ms/step\n",
      "Epoch 40/50\n",
      "38/38 - 1s - loss: 0.0201 - val_loss: 0.0622 - 600ms/epoch - 16ms/step\n",
      "Epoch 41/50\n",
      "38/38 - 1s - loss: 0.0306 - val_loss: 0.0720 - 713ms/epoch - 19ms/step\n",
      "Epoch 42/50\n",
      "38/38 - 1s - loss: 0.0322 - val_loss: 0.0606 - 626ms/epoch - 16ms/step\n",
      "Epoch 43/50\n",
      "38/38 - 1s - loss: 0.0255 - val_loss: 0.0551 - 622ms/epoch - 16ms/step\n",
      "Epoch 44/50\n",
      "38/38 - 1s - loss: 0.0234 - val_loss: 0.0292 - 578ms/epoch - 15ms/step\n",
      "Epoch 45/50\n",
      "38/38 - 1s - loss: 0.0165 - val_loss: 0.0256 - 659ms/epoch - 17ms/step\n",
      "Epoch 46/50\n",
      "38/38 - 1s - loss: 0.0183 - val_loss: 0.0502 - 587ms/epoch - 15ms/step\n",
      "Epoch 47/50\n",
      "38/38 - 1s - loss: 0.0253 - val_loss: 0.0706 - 593ms/epoch - 16ms/step\n",
      "Epoch 48/50\n",
      "38/38 - 1s - loss: 0.0324 - val_loss: 0.0523 - 687ms/epoch - 18ms/step\n",
      "Epoch 49/50\n",
      "38/38 - 1s - loss: 0.0236 - val_loss: 0.0575 - 633ms/epoch - 17ms/step\n",
      "Epoch 50/50\n",
      "38/38 - 1s - loss: 0.0221 - val_loss: 0.0442 - 674ms/epoch - 18ms/step\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 搭建LSTM模型\n",
    "model = Sequential()\n",
    "\n",
    "model.add(LSTM(100, input_shape=(train_X.shape[1], train_X.shape[2]),return_sequences=True))\n",
    "\n",
    "model.add(Dropout(0.2))\n",
    "\n",
    "model.add(LSTM(100,return_sequences=True))\n",
    "model.add(LSTM(100,return_sequences=False))\n",
    "\n",
    "model.add(Dropout(0.2))\n",
    "\n",
    "model.add(Dense(1,activation='relu'))\n",
    "\n",
    "model.compile(loss='mae', optimizer='adam')\n",
    "\n",
    "if os.path.exists(checkpoint_save_path + '.index'):\n",
    "    print('-------------load the model-----------------')\n",
    "    model.load_weights(checkpoint_save_path)\n",
    "    \n",
    "# fit network\n",
    "history = model.fit(train_X, train_y, epochs=50, batch_size=100, validation_data=(test_X, test_y), verbose=2,shuffle=False,\n",
    "                    validation_freq=1,callbacks=[cp_callback])\n",
    " \n",
    "# 绘制损失图\n",
    "plt.plot(history.history['loss'], label='train')\n",
    "plt.plot(history.history['val_loss'], label='test')\n",
    "plt.title('LSTM损失图', fontsize='12')\n",
    "plt.ylabel('loss', fontsize='10')\n",
    "plt.xlabel('epoch', fontsize='10')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "134ba838",
   "metadata": {},
   "source": [
    "* 预测并反转数据（反归一化）\n",
    "    * 需要将预测结果和测试集数据组合然后进行比例反转（invert the scaling），同时需要将测试集上的预期值也进行比例转换。 \n",
    "         这里为什么进行比例反转（反归一化）呢？（因为我们将原始数据进行了预处理（连同输出值y），此时的误差损失计算是在处理之后的数据上进行的，为了计算在原始比例上的误差需要将数据进行转化。反转时的矩阵大小一定要和原来的大小（shape）完全相同，否则就会报错。）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "b024ee64",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#模型预测收益率\n",
    "y_predict = model.predict(test_X)\n",
    "test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))\n",
    " \n",
    "# invert scaling for forecast\n",
    "#将预测结果按比例反归一化\n",
    "inv_y_test = np.concatenate((test_X[:, :3],y_predict), axis=1)\n",
    "inv_y_test = scaler.inverse_transform(inv_y_test)\n",
    "inv_y_predict=inv_y_test[:,-1]\n",
    " \n",
    "# invert scaling for actual\n",
    "#将真实结果按比例反归一化\n",
    "test_y = test_y.reshape((len(test_y), 1))\n",
    "inv_y_train = np.concatenate((test_X[:, :3],test_y), axis=1)\n",
    "inv_y_train = scaler.inverse_transform(inv_y_train)\n",
    "inv_y = inv_y_train[:, -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "9220b6f0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>反归一化后的预测结果</th>\n",
       "      <th>反归一化后的真实结果</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10.368543</td>\n",
       "      <td>11.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10.226429</td>\n",
       "      <td>11.08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>10.060360</td>\n",
       "      <td>11.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>10.048992</td>\n",
       "      <td>11.76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10.405146</td>\n",
       "      <td>11.51</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   反归一化后的预测结果  反归一化后的真实结果\n",
       "0   10.368543       11.22\n",
       "1   10.226429       11.08\n",
       "2   10.060360       11.18\n",
       "3   10.048992       11.76\n",
       "4   10.405146       11.51"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.DataFrame({\"反归一化后的预测结果\":inv_y_predict,'反归一化后的真实结果':inv_y})\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "4afb1ae4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(inv_y,color='red',label='Original')\n",
    "plt.plot(inv_y_predict,color='green',label='Predict')\n",
    "plt.xlabel('the number of test data')\n",
    "plt.ylabel('close')\n",
    "plt.title('预测与实际数据图')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7b6485c6",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "均方误差: 9.526913\n",
      "均方根误差: 3.086570\n",
      "平均绝对误差: 2.796476\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error, mean_absolute_error\n",
    "# 评估\n",
    "# calculate MSE 均方误差 ---> E[(预测值-真实值)^2] (预测值减真实值求平方后求均值)\n",
    "mse = mean_squared_error(inv_y_predict, inv_y)\n",
    "# calculate RMSE 均方根误差--->sqrt[MSE]    (对均方误差开方)\n",
    "rmse = math.sqrt(mean_squared_error(inv_y_predict, inv_y))\n",
    "# calculate MAE 平均绝对误差----->E[|预测值-真实值|](预测值减真实值求绝对值后求均值）\n",
    "mae = mean_absolute_error(inv_y_predict, inv_y)\n",
    "print('均方误差: %.6f' % mse)\n",
    "print('均方根误差: %.6f' % rmse)\n",
    "print('平均绝对误差: %.6f' % mae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "2416ac22",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率：0.885239545000568\n"
     ]
    }
   ],
   "source": [
    "#ACC\n",
    "error = 0\n",
    "summery = 0\n",
    "for i in range(24):\n",
    "    error += abs(inv_y_predict[i] - inv_y[i])\n",
    "    summery += inv_y[i]\n",
    "acc = 1 - error/summery\n",
    "print(\"准确率：{}\".format(acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b466deff",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep",
   "language": "python",
   "name": "deep"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
